package com.oop.neibulei;

//匿名内部类:定义在一个方法或者一个作用域里面的类，一个没有名字的类，是局部内部类简写

public class Tes_neibulei_2 {
    /* 演示匿名内部类的使用*/
    public static void main(String[] args) {
        Outer04 outer04 = new Outer04();
        outer04.method();
    }
}

class Outer04 { //外部类
    private int n1 = 10;//属性

    public void method() {//方法
        // 基于接口的匿名内部类//老韩解读
        //1.需求:想使用IA接口，并创建对象
        //2.传统方式，是写一个类，实现该接口，并创建对象
        //3.老韩需求是 Tiger/Dog 类只是使用一次，后面再不使用
        //4.可以使用匿名内部类来简化开发
        //5.tiger的编译类型?  IA
        //6.tiger的运行类型?   就是匿名内部类Outer04$1
        /*
           我们看底层 会分配 类名 Outer04$1
           class Outer04$1 implements IA{
               @Override
               public void cry() {
                   System.out.println("老虎叫唤...”);
               }
           }
        */
        //7.jdk底层在创建匿名内部类Outer04$1,立即马上就创建了 Outer04$1实例，并且把地址返回给 tiger
        //8.匿名内部类使用一次，就不能再使用
        IA tiger = new IA() {
            @Override
            public void cry() {
                System.out.println("老虎叫唤...");
            }
        };
        System.out.println("tiger的运行类型=" + tiger.getClass());
        tiger.cry();

//      IA tiger = new Tiger();
//      tiger.cry();

        //演示基于类的匿名内部类
        //1、Father编译类型Father
        //2、Father运行类型Outer04$2
        /*3、
        class Outer04$2 extends father{
            @Override
            public void test(){
                System.out.println("匿名内部类重写了test方法");
        }
         */
        //4、同时也直接返回了 匿名内部类 Outer04$2对象
        Fater fater = new Fater("jack"){
            @Override
            public void test(){
                System.out.println("匿名内部类重写了test方法");
            }
        };
        System.out.println("Father对象的运行类型" + fater.getClass());//Outer04$2

        //基于抽象类的匿名内部类
        //抽象类里的方法就必须重写实现
        Animal animal = new Animal(){
            @Override
            void eat(){
                System.out.println("基于抽象类的匿名内部类");
            }
        };
        animal.eat();

    }
}

interface IA {//接口
    public void cry();
}

//class Tiger implements IA{
//    @Override
//    public void cry(){
//    System.out.println("老虎叫唤。。。。");
//  }
//}

class Fater {//其他类
    public Fater(String name) {//构造器
        super();
    }

    public void test() {//方法

    }
}

abstract class Animal{//抽象类
    abstract void eat();
}
